# -*- coding: utf-8 -*-
# @Time    : 2024/7/22 16:51
# @Author  : yujiahao
# @File    : 53_fastapi_response.py
# @description:直接返回响应

"""
当你创建一个 FastAPI 路径操作时，你可以正常返回以下任意一种数据：dict，list，Pydantic 模型，数据库模型等等。

FastAPI 默认会使用 jsonable_encoder 将这些类型的返回值转换成 JSON 格式，jsonable_encoder 在 JSON 兼容编码器 中有阐述。

然后，FastAPI 会在后台将这些兼容 JSON 的数据（比如字典）放到一个 JSONResponse 中，该 JSONResponse 会用来发送响应给客户端。

但是你可以在你的路径操作中直接返回一个 JSONResponse。

直接返回响应可能会有用处，比如返回自定义的响应头和 cookies。

我们也可以返回自定义 Response，这个在自定义异常里面也有提及 21_fastapi_excrption.py
假设你想要返回一个 XML 响应。

你可以把你的 XML 内容放到一个字符串中，放到一个 Response 中，然后返回。
"""
import uvicorn
from fastapi import FastAPI, Response

app = FastAPI()


@app.get("/legacy/")
def get_legacy_data():
    """
    说明

    当你直接返回 Response 时，它的数据既没有校验，又不会进行转换（序列化），也不会自动生成文档。

    但是你仍可以参考 OpenAPI 中的额外响应 给响应编写文档。

    在后续的章节中你可以了解到如何使用/声明这些自定义的 Response 的同时还保留自动化的数据转换和文档等。
    """
    data = """<?xml version="1.0"?>
    <shampoo>
    <Header>
        Apply shampoo here.
    </Header>
    <Body>
        You'll have to use soap here.
    </Body>
    </shampoo>
    """
    return Response(content=data, media_type="application/xml")


if __name__ == '__main__':
    uvicorn.run(app, host='0.0.0.0', port=8000)
